//1.Object.create()
let user1 = {
    name: 'zhangsan',
    password: 123
}
let user2 = Object.create(user1);
console.log(user2.__proto__ == user1);//true
console.log(user2.name);//user2.__proto__.name

let user3 = Object.create(user1, {
    job: {
        value: 'teacher',
        //以下三个属性可以更好的去控制对象的属性，默认是均为false
        enumerable: true,//控制当前属性可查看或枚举
        writable: false,//控制是否可修改,默认是false
        configurable: true //是否可删除

    }
})
user3.job = 'student';
delete user3.job;
console.log(user3.job);
console.log(user3);


//2.Object.is()  判断是否相等
// 都是 undefined
// 都是 null
// 都是 true 或都是 false
// 都是相同长度、相同字符、按相同顺序排列的字符串
// 都是相同对象（意味着都是同一个对象的值引用）
// 都是数字且
// 都是 +0
// 都是 -0
// 都是 NaN
// 都是同一个值，非零且都不是 NaN
// console.log(1 == '1');
// console.log(NaN == NaN);
console.log(Object.is(NaN, NaN), 1111);
let arr1 = [1, 2, 3], arr2 = [1, 2, 3];
let arr3 = arr1;
console.log(Object.is(arr1, arr2));
console.log(Object.is(arr1, arr3));


//3.Object.assign() 合并对象

let a = {
    x: 1,
    obj: {
        aa: 1,
        bb: 2
    }
}
let b = {
    y: 2
}

let newObj = Object.assign({}, a, b);
console.log(newObj);//{ x: 1, obj: { aa: 1, bb: 2 }, y: 2 }
console.log(a, b);

let obj3 = {
    ...a,
    ...b
}
console.log(obj3);


// 4.Object.getOwnPropertyNames(obj)

// let obj = {
//     q: 1,
//     w: 2,
//     e: 3,
//     7: 'a',
//     1: 'b',
//     3: 'c'
// }
// let props=Object.getOwnPropertyNames(obj);
// console.log(props);


//Object.defineProperty() 

let obj = {
    name: 'zhangsan',
    age: 12
}
Object.defineProperty(obj, 'gender', {
    value: '男',
    enumerable: true,//控制当前属性可查看或枚举
    writable: false,//控制是否可修改,默认是false
    configurable: true //是否可删除
})
console.log(obj);
// let bValue = 13123;
// Object.defineProperty(obj, 'tel', {
//     get() { return bValue; },
//     set(val) {
//         console.log('tel----' + val);
//     }
// }
// )
// obj.tel = '1234';
// console.log(obj);


function foo() {
    console.log(this);
}
foo()